package com.自我练习.动态代理.JDK动态代理实现;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 定义一个 UserService 接口，包含两个核心方法：
 * void addUser(String username)：新增用户
 * boolean deleteUser(String username)：删除用户（返回删除是否成功）
 * 实现接口的目标类 UserServiceImpl，方法内部仅需打印「核心业务逻辑执行」（如 “执行新增用户：xxx”），无需复杂业务。
 * 使用 JDK 动态代理 编写一个「日志代理器」，要求：
 * 代理所有 UserService 接口方法的调用；
 * 调用目标方法 前，打印日志：“[日志] 开始调用方法：xxx，参数：xxx”（xxx 替换为实际方法名和参数）；
 * 调用目标方法 后，打印日志：“[日志] 方法 xxx 调用结束，返回值：xxx”（无返回值则显示 null）；
 * 若方法调用抛出异常，打印日志：“[日志] 方法 xxx 调用异常：xxx”（xxx 为异常信息）。
 * 编写测试类，通过代理对象调用 addUser 和 deleteUser，验证日志是否完整输出。
 *
 *
 *
 *
 *
 */
public class E1 {
    public static void main(String[] args) {
        //目标对象
        UserServiceImpl userService = new UserServiceImpl();

        //创建代理对象
        UserService proxy = (UserService) Proxy.newProxyInstance(

        )


    }
}

interface UserService {
    void addUser(String username);
    boolean deleteUser(String username);
}

class UserServiceImpl implements UserService {
    @Override
    public void addUser(String username) {
        System.out.println("执行新增用户：" + username);
    }

    @Override
    public boolean deleteUser(String username) {
        return false;
    }
}
//
class MyInvocationHandler implements InvocationHandler {
    //目标对象
    private Object target;
    public MyInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      //前置增强
        System.out.println("[日志] 开始调用方法：" + method.getName() + "，参数：" + args[0]);
        //调用目标方法
        Object result = method.invoke(target, args);
        //后置增强
        System.out.println("[日志] 方法 " + method.getName() + " 调用结束，返回值：" + result);
        return result;
    }
}